package poi;

import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

/**
 * POI 操作 word文档
 * 参考文献：http://bbs.51cto.com/thread-1089985-1.html
 * 需要使用apache的poi开源项目包；下载地址：http://poi.apache.org/download.html
 * @author lfy.xys
 * @Date 2018年1月18日 
 */
public class POIctrlWord {
	/**     
     * 替换文档中的数据
     * @author lfy.xys 
     * @Date 2018年1月18日 
     */ 
    public static void searchAndReplace(String srcPath, String destPath, Map<String, String> map) {  
    	try{
     		//String srcPath = "/User/a.docx";
    		OPCPackage opc = POIXMLDocument.openPackage(srcPath);
    
    		XWPFDocument document = new XWPFDocument(opc); //
    		 // 替换段落中的指定文字  
    		Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();  
    		while (itPara.hasNext()) {  
    			XWPFParagraph paragraph = (XWPFParagraph) itPara.next();  
    		            //String s = paragraph.getParagraphText();          
    			Set<String> set = map.keySet();  
    			Iterator<String> iterator = set.iterator();  
    			while (iterator.hasNext()) {  
    				String key = iterator.next();  
    				List<XWPFRun> run=paragraph.getRuns();  
    				for(int i=0;i<run.size();i++) {  
    					if(run.get(i).getText(run.get(i).getTextPosition())!=null && run.get(i).getText(run.get(i).getTextPosition()).equals(key))  {      
    		                //参数0表示生成的文字是要从哪一个地方开始放置,设置文字从位置0开始 就可以把原来的文字全部替换掉了            
    		                run.get(i).setText(map.get(key),0);      
    		            }      
    		        }      
    		    }      
    		}  
    
    	    // 替换表格中的指定文字  
    		Iterator<XWPFTable> itTable = document.getTablesIterator();  
    		while (itTable.hasNext()) {  
    			XWPFTable table = (XWPFTable) itTable.next();  
    			int rcount = table.getNumberOfRows();  
    			for (int i = 0; i < rcount; i++) {  
    				XWPFTableRow row = table.getRow(i);  
    				List<XWPFTableCell> cells = row.getTableCells();  
    				for (XWPFTableCell cell : cells) {  
    					// ${node1} 放到word的模板里，会替换 
    					if("${node1}".equals(cell.getText())){
    						cell.removeParagraph(0);
    						cell.setText("自定义的数据");
    					}
    				}	  
    			}  
    		}  
    
    		//操作页眉，对页眉进行替换。遍历每个 header.xml，因为有 首页不同 的选项，但是测试改了 header0 和 header1 的xml就可以了。
    		List<XWPFHeader> headerList = document.getHeaderList();
    		for (XWPFHeader xwpfHeader : headerList) {
    			List<XWPFParagraph> paragraphs = xwpfHeader.getParagraphs();
    			for(XWPFParagraph paragraph : paragraphs){
    				List<XWPFRun> runs = paragraph.getRuns();
    				//输出 页眉的 所有 数据
    				System.out.println("runs:" + runs.toString());
    				for(XWPFRun run : runs){
    					String text = run.getText(0);
    					if(StringUtils.isNotEmpty(text)){
    						text = text.replace("${node2}","自定义的数据2");
    						run.setText(text,0);
    					}
    				}
    			}
			}
    
    		//destPath 输出路径
    		FileOutputStream outStream = new FileOutputStream(destPath);  
    		document.write(outStream);  
    		outStream.close(); 
    
    	}catch(Exception e){
    		
    	}
    }
}
